package com.he.hsdyc.common.async;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import redis.event.listener.KeyExpireListener;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 异步接口主动查询监听
 */
@SuppressWarnings("unchecked")
@Component
public class BidPulishListener implements KeyExpireListener {
    public static String PREFIX="bid:publish:";
    public static String EXPIRE="expire";

    private final RedisTemplate redisTemplate;

    public BidPulishListener(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean suppportKey(String key) {
        return this.getMobile(key) != null;
    }

    // TODO: 始终没有自动进入失效？？？？？？？？？？？？？？
/*     项目中引入redis
            1》导入pom依赖-spring-boot-starter-data-redis
            2》添加reids配置类-RedisConfiguration
            3》dev添加配置文件   注意是否配置密码
            4》要使用的类中  @Autowired注入Redistemplate  可以使用redis相关方法
            redis实现失效监听：
            1》添加失效监听配置类
            2》写一个失效监听类BidPulishListener implements KeyExpireListener，action方法里即失效后触发，可以实现自己的业务
            3》业务方法里添加redis键， redisTemplate.expire(key,20, TimeUnit.SECONDS);为键设置失效时间，时间一到删除键并且触发监听事件
            4》注意的点：1、RedisEventConfiguration中 new ChannelTopic("__keyevent@0__:expired");0指的是对应失效键的库，要和yml中的redis设置一样
                        2·yml中最好不要配置redis密码，否则有权限的校验
                        3.修改配置文件redis.conf中的：notify-keyspace-events "Ex"，这里不加引号可能不起作用，之后重启redis服务
        修改好配置文件后，redis会对设置了expire的数据进行监听，当数据过期时便会将其从redis中删除
        发现redis监听一个很坑的点：上面工作都做好之后还是删除了键之后却没有触发监听类，找不到出错的地方
        后来找了个Jedis的失效监听，成功实现监听，因为其在代码中配置了notify-keyspace-events "Ex"，之后发现，好像是这个代码中的设置在redis配置中起了作用，
        之后就算关闭代码配置，但是在redis.conf中配置了Ex的话，还是会持续性的起作用，也就是在不起作用的时候，先运行代码配置Ex的Jedis失效监听*/
    @Override
    public void action(String key) {
    	//mobile
        String mobile = this.getMobile(key);
        System.out.println("=======================进入失效======================="+mobile);
        //失效监听
        //更新标的发布状态
        System.out.println("=======================失效后可以执行的其他操作，如更改状态......");
        System.out.println("=======================当前时间："+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    private String getMobile(String key) {
        Pattern keyPattern = Pattern.compile("(?<=^" + PREFIX + ").*(?=:" + EXPIRE + "$)");
        Matcher matcher = keyPattern.matcher(key);
        if (matcher.find())
            return matcher.group();
        return null;
    }
    
    public static String constructPublishBid(String mobile) {
    	return PREFIX+mobile+":"+EXPIRE;
    }
}
